/*
 * 18-mar-2007 
 */
package futbol.tacticas.concursantes2007.Chuky.chuky.futbolista;

import java.awt.Point;

import futbol.General;

/**
 *
 * @author Joan Crosas
 */
public class Balon {
	private Point[] posicionBalon;
	private double velocidadBalon;
	
	/**
	 * 
	 */
	public Balon() {
		posicionBalon = new Point[2];
		posicionBalon[0] = new Point( 0, 0 );
		posicionBalon[1] = new Point( 0, 0 );
	}
	
	/**
	 * Constructor preparado para inicializar el baln en un sitio determinado,
	 * con una direccin determinada y una velocidadInicial determinada
	 * @param posicionInicial
	 * @param angulo
	 * @param velocidadBalon
	 */
	public Balon( Point posicionInicial, double angulo, double velocidadBalon ) {
		this.velocidadBalon = velocidadBalon;
		
		posicionBalon = new Point[2];
		posicionBalon[0] = posicionInicial;
		
		double xFutura = posicionBalon[0].getX() + velocidadBalon * Math.cos( angulo );
		double yFutura = posicionBalon[0].getY() + velocidadBalon * Math.sin( angulo );
		
		if( xFutura > 160 ) {
			xFutura = 320 - xFutura;
		}
		if (xFutura < -160) {
			xFutura = -320 - xFutura;
		}
		if (yFutura > 120) {
			yFutura = 240 - yFutura;
		}
		if (yFutura < -120) {
			yFutura = -240 - yFutura; 
		}
		
		Point posFutura = new Point();
		posFutura.setLocation( xFutura, yFutura );
		
		posicionBalon[1] = posFutura;
		
	}
	
	/**
	 * 
	 * @param posBalon Posicin actual del baln
	 */
	public void setPosicion( Point posBalon ) {
		Point posicionFutura = getPosicionFutura( 1 );
		double distancia = posicionFutura.distance( posBalon );
		
		// si la distancia es mayor que 160 ha habido un gol
		if( distancia > 100 && posBalon.equals( new Point( 0, 0 ) ) ) {
			//System.out.println( "ControlBalon - setPosicion() - gol!!!!" );
			posicionBalon[0] = new Point( 0, 0 );
			posicionBalon[1] = new Point( 0, 0 );
			velocidadBalon = 0;
		
		} else {
			posicionBalon[0] = posicionBalon[1];
			posicionBalon[1] = posBalon;
			velocidadBalon = posicionBalon[1].distance( posicionBalon[0] ); // FIXME problemes quan pica a la banda
		}
		
	}
	
	public double getVelocidadBalon() {
		return velocidadBalon;
	}
	
	public Point getPosicionBalon() {
		return posicionBalon[1];
	}
	
	/**
	 * Metodo que predice donde se encontrar la pelota en un instante de tiempo futuro
	 * @param t Instante de tiempo futuro. Para t comprendida entre 1 y velocidadBalon
	 * @return
	 */
	public Point getPosicionFutura( int t ) {
		if( velocidadBalon < 1 ) {
			return posicionBalon[1];
		}
		if( t > velocidadBalon ) {
			t = (int) velocidadBalon;
		}
		
		double distanciaBalon = velocidadBalon * t - ( t * ( t - 1 ) / 2 );

		double alfa = General.getAngulo( posicionBalon[0].getX(), posicionBalon[0].getY(), posicionBalon[1].getX(), posicionBalon[1].getY() );
		
		double xFutura = posicionBalon[1].getX() + distanciaBalon * Math.cos( alfa );
		double yFutura = posicionBalon[1].getY() + distanciaBalon * Math.sin( alfa );
		
		if( xFutura > 160 ) {
			xFutura = 320 - xFutura;
		}
		if (xFutura < -160) {
			xFutura = -320 - xFutura;
		}
		if (yFutura > 120) {
			yFutura = 240 - yFutura;
		}
		if (yFutura < -120) {
			yFutura = -240 - yFutura; 
		}
		
		Point posFutura = new Point();
		posFutura.setLocation( xFutura, yFutura );
		return posFutura;
	}

}
